/*
    Esta clase es la encargada de encapsular toda la inteligencia
    respecto a guardar en un archivo "key" = "value".
    No contiene nada respecto a la vista.
    De eso se encarga otra clase ( VistaProperties ).
*/


#ifndef ABM_PROPERTIES_H_INCLUDED
#define ABM_PROPERTIES_H_INCLUDED

#include <string>
#include <fstream>
#include <iostream>
#include <list>

#include "MyException.h"

    //un struct para agrupar informacion
class Paquete{
    public:
    std::string Key;
    std::string Value;
    Paquete(const std::string& K,const std::string& V):Key(K),Value(V){}
    ~Paquete(){};
};


class ABM_Properties{
    private:
    std::list<Paquete*>::iterator FindIt(const std::string& Key,bool& F);
    std::list<Paquete*> ListadoKV;
    std::string RutaArchivo;

    public:

    ABM_Properties(const std::string& ruta)
    {
        this->RutaArchivo = ruta;
        std::ifstream Properties;
        //creo el archivo vacio.
        Properties.open(this->RutaArchivo.c_str());
        Properties.close();
    }

    ~ABM_Properties();

    bool SeEncuentra(const std::string& k)
    {
        bool f;
        this->FindIt(k,f);
        return f;
    }

    bool IsFilled(const std::string& k)
    {
        bool f=false;
        bool aux;
        std::list<Paquete*>::iterator it;
        it = this->FindIt(k,aux);
        if ( aux && (*it)->Value != "" ){f=true;}
        return f;
    }

    std::string GetValueFromKey(const std::string& Key);

    //ABM se realiza en MEMORIA,para guardar cambios volcar a disco
    bool Escribir(const std::string& K, const std::string& V);
    bool Eliminar(const std::string& K);

    //levanta el archivo a memoria
    void LevantarFile();
    //guarda el archivo en disco
    void VolcarFile();

    //metodos pensados para ser usados por la vista
    // OJO : iterador constante!
    std::list<Paquete*>::const_iterator begin()
    {
        return this->ListadoKV.begin();
    }

    std::list<Paquete*>::const_iterator end()
    {
        return this->ListadoKV.end();
    }

    bool is_empty( )
    {
        std::ifstream pFile;
        pFile.open(this->RutaArchivo.c_str());
        bool b = (pFile.peek() == std::ifstream::traits_type::eof());
        pFile.close();
        return b;
    }

};
#endif // ABM_PROPERTIES_H_INCLUDED
